/*

 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.bettosimport.datos;

import com.bettosimport.entidades.Familia;
import com.bettosimport.entidades.Marca;
import com.bettosimport.entidades.Producto;
import com.bettosimport.entidades.Producto_Precio;
import com.bettosimport.entidades.Sucursal;
import com.bettosimport.entidades.Sucursal_Producto;
import com.bettosimport.entidades.Tipo_Precio;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;

/**
 *
 * @author Neil
 */
public class ProductoDAO {

    private static ProductoDAO _Instancia;

    private ProductoDAO() {
    }

    public static ProductoDAO Instancia() {
        if (_Instancia == null) {
            _Instancia = new ProductoDAO();
        }
        return _Instancia;
    }

    public ArrayList<Sucursal_Producto> listarProductos(int suc, int linea, int familia) throws Exception {
        ArrayList<Sucursal_Producto> productos;
        Connection cn = null;
        try {
            productos = new ArrayList<>();
            cn = ConexionDAO.Instancia().getConexion();
            CallableStatement cs = cn.prepareCall("{call sp_listarProducto(?,?,?)}");
            cs.setInt(1, suc);
            cs.setInt(2, linea);
            cs.setInt(3, familia);
            ResultSet rs = cs.executeQuery();
            while (rs.next()) {
                Sucursal_Producto sp = new Sucursal_Producto();
                Producto p = new Producto();
                p.setId_prod(rs.getInt("id_prod"));
                p.setDesc_prod(rs.getString("desc_prod"));
                p.setModel_prod(rs.getString("model_prod"));
                Marca m = new Marca();
                m.setDesc_marca(rs.getString("desc_marca"));
                p.setMarca(m);
                sp.setProducto(p);
                sp.setStock(rs.getInt("stock"));
                productos.add(sp);
            }
            return productos;
        } catch (Exception e) {
            throw e;
        } finally {
            cn.close();
        }
    }

    public ArrayList<Producto_Precio> listarPreciosDeProductos(int suc, int prod) throws Exception {
        ArrayList<Producto_Precio> precios;
        Connection cn = null;
        try {
            precios = new ArrayList<>();
            cn = ConexionDAO.Instancia().getConexion();
            CallableStatement cs = cn.prepareCall("{call listPreciosProdxSuc(?,?)}");
            cs.setInt(1, suc);
            cs.setInt(2, prod);
            ResultSet rs = cs.executeQuery();
            while (rs.next()) {
                Producto_Precio pp = new Producto_Precio();
                Tipo_Precio tp = new Tipo_Precio();
                tp.setId_tipo(rs.getInt("id_tipo"));
                tp.setDesc_tipo(rs.getString("desc_tipo"));
                pp.setTipoprecio(tp);
                pp.setCantidad(rs.getInt("cantidad"));
                pp.setPrecio(rs.getDouble("precio"));
                precios.add(pp);
            }
            return precios;
        } catch (Exception e) {
            throw e;
        } finally {
            cn.close();
        }
    }

    public ArrayList<Sucursal_Producto> listarStockDeProducto(int prod) throws Exception {
        ArrayList<Sucursal_Producto> stockProd;
        Connection cn = null;
        try {
            stockProd = new ArrayList<>();
            cn = ConexionDAO.Instancia().getConexion();
            CallableStatement cs = cn.prepareCall("{call sp_listStockxProd(?)}");
            cs.setInt(1, prod);
            ResultSet rs = cs.executeQuery();
            while (rs.next()) {
                Sucursal_Producto sp = new Sucursal_Producto();
                Sucursal s = new Sucursal();
                Producto p = new Producto();
                p.setId_prod(rs.getInt("id_prod"));
                s.setId_suc(rs.getInt("id_suc"));
                s.setCiudad_suc(rs.getString("des"));

                sp.setSucursal(s);
                sp.setProducto(p);
                sp.setStock(rs.getInt("stock"));
                stockProd.add(sp);
            }
            return stockProd;
        } catch (Exception e) {
            throw e;
        } finally {
            cn.close();
        }
    }

    public Producto buscarProductos(int idprod) throws Exception {
        Producto p = null;
        Connection cn = null;
        try {
            cn = ConexionDAO.Instancia().getConexion();
            CallableStatement cs = cn.prepareCall("{call sp_buscarProducto(?)}");
            cs.setInt(1, idprod);
            ResultSet rs = cs.executeQuery();
            if (rs.next()) {
                p = new Producto();
                p.setId_prod(rs.getInt("id_prod"));
                p.setDesc_prod(rs.getString("desc_prod"));
                p.setModel_prod(rs.getString("model_prod"));
                Marca m = new Marca();
                m.setId_marca(rs.getInt("marca_id"));
                p.setMarca(m);
                Familia f = new Familia();
                f.setId_fam(rs.getInt("familia_id"));
                p.setFamilia(f);
            }
            return p;
        } catch (Exception e) {
            throw e;
        } finally {
            cn.close();
        }
    }

    public ArrayList<Producto> filtrarProductos(String desc_prod) throws Exception {
        ArrayList<Producto> productos;
        Connection cn = null;
        try {
            productos = new ArrayList<>();
            cn = ConexionDAO.Instancia().getConexion();
            CallableStatement cs = cn.prepareCall("{call filtrarProducto(?)}");
            cs.setString(1, desc_prod);
            ResultSet rs = cs.executeQuery();
            while (rs.next()) {
                Producto p = new Producto();
                p.setId_prod(rs.getInt("id_prod"));
                p.setDesc_prod(rs.getString("desc_prod"));
                p.setModel_prod(rs.getString("model_prod"));
                Marca m = new Marca();
                m.setDesc_marca(rs.getString("desc_marca"));
                p.setMarca(m);
                productos.add(p);
            }
            return productos;
        } catch (Exception e) {
            throw e;
        } finally {
            cn.close();
        }
    }

    public int guardarproducto(String cadXML, int id_prod) throws Exception {
        Connection cn = null;
        try {
            cn = ConexionDAO.Instancia().getConexion();
            CallableStatement cs = cn.prepareCall("{call sp_guardarProducto(?,?)}");
            cs.setString(1, cadXML);
            cs.setInt(2, id_prod);
            int valor = cs.executeUpdate();
            return valor;
        } catch (Exception e) {
            throw e;
        } finally {
            cn.close();
        }
    }
}
